#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

void fn () {
    // exit(EXIT_FAILURE);  // 直接退出程序
    return -1;  //  并不能结束程序
}

int main(int argc, char const *argv[])
{

    fn();

    // 1. 打开读的文件
    int fd = open("love.txt", O_RDONLY);  // 返回文件描述符， 是内部与文件连接的标识
    if(fd == -1)
    {
        perror("打开love.txt失败");
        return -1; // 失败退出
    }

    // 2. 打开写的文件
    int fd2 = open("love2.txt", O_CREAT|O_WRONLY|O_APPEND, 0644);
    if (fd2 == -1)
    {
        perror("打开love2.txt失败");
        // 关闭读的文件
        close(fd);
        return -1;
    }

    // 3. 不断的边读边写， 并输出到控制台
    char buf[100];
    int read_size;
    while((read_size = read(fd, buf, sizeof(buf))) > 0)
    {
        // 写到fd2的文件
        write(fd2, buf, read_size);
        // 输出到控制台
        write(STDOUT_FILENO, buf, read_size);
    }

    // 如果读取文件数据失败，提示并错误退出
    if(read_size == -1)
    {
        perror("读取文件失败");
        // 关闭读的文件
        close(fd);
        // 关闭写的文件
        close(fd2);
        // 失败退出
        // return -1;
        // exit(EXIT_FAILURE);  // 前面可以不用关闭文件，内部会自动关闭 =》但编码时一般都会手动关闭
        _exit(EXIT_FAILURE); // 前面必须手动关闭文件，内部不会自动关闭
    }

    // 4. 关闭文件
    close(fd);
    close(fd2);
    // 成功退出
    return 0;
}
